In [1]:
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import numpy as np

url = "https://raw.githubusercontent.com/bcaffo/MRIcloudT1volumetrics/master/inst/extdata/multilevel_lookup_table.txt"
multilevel_lookup = pd.read_csv(url, sep = "\t").drop(['Level5'], axis = 1)
multilevel_lookup = multilevel_lookup.rename(columns = {
    "modify"   : "roi", 
    "modify.1" : "level4",
    "modify.2" : "level3", 
    "modify.3" : "level2",
    "modify.4" : "level1"})
multilevel_lookup = multilevel_lookup[['roi', 'level4', 'level3', 'level2', 'level1']]

subjectData = pd.read_csv('https://raw.githubusercontent.com/smart-stats/ds4bio_book/main/book/assetts/kirby21AllLevels.csv').drop(['Unnamed: 0'], axis = 1)
subjectData = subjectData.loc[(subjectData.type == 1) & (subjectData.level == 5) & (subjectData.id == 127)]
subjectData = subjectData[['roi', 'volume']]

subjectData = pd.merge(subjectData, multilevel_lookup, on = "roi")
subjectData = subjectData.assign(icv = "ICV")
subjectData = subjectData.assign(comp = subjectData.volume / np.sum(subjectData.volume))

lv1=subjectData.groupby(['icv', 'level1'], as_index=False)['comp'].count()
lv2=subjectData.groupby(['level1', 'level2'], as_index=False)['comp'].count()
lv3=subjectData.groupby(['level2','level3'], as_index=False)['comp'].count()

lv1.columns = ['target', 'source', 'comp']
lv2.columns = ['target', 'source', 'comp']
lv3.columns = ['target', 'source', 'comp']
app1 = lv1.append(lv2)
app2 = app1.append(lv3)

lv3_nodes = app2.target.values.tolist() + app2.source.values.tolist()

source_indices = [lv3_nodes.index(target) for target in app2.target]
target_indices = [lv3_nodes.index(source) for source in app2.source]

fig = go.Figure(data=[go.Sankey(
    node = dict(
      label =  lv3_nodes,
      color =  "blue"
    ),

    link = dict(
      source =  source_indices,
      target =  target_indices,
      value =  app2.comp,
))])

fig.update_layout(title_text="MRICloud data for Subject ID 127 (Levels 1-3)",
                  font_size=10)
fig.show()
/tmp/ipykernel_85678/4145175234.py:31: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  app1 = lv1.append(lv2)
/tmp/ipykernel_85678/4145175234.py:32: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  app2 = app1.append(lv3)
In [ ]: